﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ConfeccionesJR.Entites;
using ConfeccionesJR.BussinesLogic;
using Microsoft.Practices.Unity;

namespace ConfeccionesJR.UI
{
    public partial class frmMttoProducto : Form
    {
        [Dependency]
        public IProductoBL productoBL { get; set; }

        [Dependency]
        public IUnidadMedidaBL undMedidaBL { get; set; }

        [Dependency]
        public IMaterialBL materialBL { get; set; }

        [Dependency]
        public IDetalleProductoBL detProdBL { get; set; }

        public frmMttoProducto()
        {
            InitializeComponent();
            this.BuildUp();
            uNIDAD_MEDIDABindingSource.DataSource = undMedidaBL.GetAllFromUnidaMedidas();
        }
        
        bool isNew;

        public Int32 IdProd { get; set; }
        
        private void frmMttoProducto_Load(object sender, EventArgs e)
        {
            mATERIALBindingSource.DataSource = materialBL.GetAllFromMaterial();
            
            SinMateriales();

            if (isNew == false)
            {
                var _producto = productoBL.GetFromProductoById(IdProd);
                _producto.UNIDAD_MEDIDAs = undMedidaBL.GetFromUnidadMedidaById(_producto.undMedidaId);

                pRODUCTOBindingSource.DataSource = _producto;
                cbUndMedida.SelectedValue = _producto.undMedidaId;
            }

        }

        private void SinMateriales()
        {
            if (rbtnMateriales.Checked)
            {
                gbProductos.Enabled = false;
                gbDetalles.Enabled = false;
            }
            else
            {
                gbProductos.Enabled = true;
                gbDetalles.Enabled = true;
            }
        }

        private void rbtnMateriales_CheckedChanged(object sender, EventArgs e)
        {
            SinMateriales();
        }

        private void rbtnMateriales_Click(object sender, EventArgs e)
        {
            SinMateriales();
        }

        public void Nuevo()
        {
            isNew = true;
            pRODUCTOBindingSource.AddNew();
        }

        public void Editar(Int32 id)
        {
            isNew = false;

            var _producto = productoBL.GetFromProductoById(id);
            _producto.UNIDAD_MEDIDAs = undMedidaBL.GetFromUnidadMedidaById(_producto.undMedidaId);

            pRODUCTOBindingSource.DataSource = _producto;                        
        }

        public void EditarOfCompra(decimal nuevoCosto, Int32 IdProd)
        {
            isNew = false;

            var _producto = productoBL.GetFromProductoById(IdProd);

            _producto.UNIDAD_MEDIDAs = undMedidaBL.GetFromUnidadMedidaById(_producto.undMedidaId);

            pRODUCTOBindingSource.DataSource = _producto;

            cbUndMedida.SelectedValue = _producto.undMedidaId;                 
        }

        private void cbUndMedida_Click(object sender, EventArgs e)
        {
            uNIDAD_MEDIDABindingSource.DataSource = undMedidaBL.GetAllFromUnidaMedidas();
        }

        private void btnVerificarDesc_Click(object sender, EventArgs e)
        {
            if (descripcionTextBox.Text.Length > 0)
            {
                VerificarDescripcion();
            }
            else
            {
                MessageBox.Show(this, "La Descripción es requerida", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                descripcionTextBox.Focus();
            }

        }

        private void descripcionTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
                if (descripcionTextBox.Text.Length > 0)
                {
                    VerificarDescripcion();
                }
                else
                {
                    MessageBox.Show(this, "La Descripción es requerida", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    descripcionTextBox.Focus();
                }
            }
        }

        private void VerificarDescripcion()
        {
            #region Add
            if (isNew == true)
            {
                var descripcion = productoBL.GetOneProductoByDescripcion(descripcionTextBox.Text);
                if (descripcion != null)
                {
                    PRODUCTO currentProducto = descripcion as PRODUCTO;
                    pRODUCTOBindingSource.DataSource = descripcion;

                    DialogResult rpta = MessageBox.Show(this, string.Format("Ya existe un Producto con la misma descripción"),
                        "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    if (rpta == DialogResult.OK && isNew == true)
                    {
                        Close();
                    }
                }
                else
                {
                    MessageBox.Show(this, "Descripción disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            #endregion
            #region Update
            else 
            {
                var _producto = pRODUCTOBindingSource.Current as PRODUCTO;
                var existe = productoBL.ExisteDuplicidadProdDescripcion(descripcionTextBox.Text, _producto.Id);
                if (existe)
                {
                    DialogResult rpta = MessageBox.Show(this, string.Format("Ya existe un Producto con la misma descripción"),
                        "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show(this, "Descripción disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            #endregion
        }

        private void descripcionTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            //if (e.KeyCode == Keys.Enter)
            //{
            //    if(descripcionTextBox.Text.Length > 0)
            //    {
            //        VerificarDescripcion();
            //    }
            //    else
            //    {
            //        MessageBox.Show(this, "La Descripción es requerida", "Mensaje",MessageBoxButtons.OK, MessageBoxIcon.Information);
            //        descripcionTextBox.Focus();
            //    }
            //}

        }

        private void descripcionTextBox_Leave(object sender, EventArgs e)
        {
            //if (descripcionTextBox.Text.Length > 0)
            //{
            //    VerificarDescripcion();
            //}
            //else
            //{
            //    MessageBox.Show(this, "La Descripción es requerida", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            //    //descripcionTextBox.Focus();
            //}
        }

        private void BuscarEnMateriales()
        {
            List<MATERIAL> existenMateriales;
            existenMateriales = materialBL.GetFromMaterialByDescripcion(TxtDescripcion.Text);

            if (existenMateriales.Count <= 0)
            {
                lblMensaje.Visible = true;
            }
            else
            {
                lblMensaje.Visible = false;
                mATERIALBindingSource.DataSource = existenMateriales;
            }
        }

        private void BtnBuscar_Click(object sender, EventArgs e)
        {
            BuscarEnMateriales();
        }

        private void TxtDescripcion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarEnMateriales();
            }
        }

        private void mATERIALDataGridView_DoubleClick(object sender, EventArgs e)
        {
            AgregarMaterial();
        }

        private void AgregarMaterial()
        {
            var _material = mATERIALBindingSource.Current as MATERIAL;
            PRODUCTO _producto = pRODUCTOBindingSource.Current as PRODUCTO;

            if (_material != null)
            {
                var detalleP = new DETALLE_PRODUCTO
                {
                    productoId = _producto.Id,
                    Cantidad = 1, 
                    MATERIAL = _material,
                    materialId = _material.Id, 
                    PrecioUnit = _material.Costo,
                };

                var existe = _producto.DETALLE_PRODUCTO.Where(dp => dp.materialId.Equals(_material.Id)).SingleOrDefault();

                if (existe == null)
                {
                    _producto.DETALLE_PRODUCTO.Add(detalleP);
                    var tot = _producto.DETALLE_PRODUCTO.Sum(p => p.Monto);
                    _producto.Costo = Math.Round(tot, 2);

                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El material : {0}," + "ya se encuentra en el detalle",
                        _material.Descripcion), "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                pRODUCTOBindingSource.ResetBindings(true);
                dETALLE_PRODUCTOBindingSource.ResetBindings(true);
            }
        }

        private void mATERIALDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.mATERIALDataGridView.Columns[e.ColumnIndex].Name.Equals("Agregar"))
            {
                AgregarMaterial();
            }
        }

        private void BtnNewMaterial_Click(object sender, EventArgs e)
        {
            frmMttoMaterial frm = new frmMttoMaterial();
            frm.Nuevo();
            frm.ShowDialog();
            mATERIALBindingSource.DataSource = materialBL.GetFromMaterialByDescripcion(TxtDescripcion.Text);
        }

        private void txtMatDetalle_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarMatEnDetalle();
            }
        }

        private void BtnBuscarDetalle_Click(object sender, EventArgs e)
        {
            BuscarMatEnDetalle();  
        }

        private void BuscarMatEnDetalle()
        {

            List<DETALLE_PRODUCTO> listatemp = new List<DETALLE_PRODUCTO>();
            var material = mATERIALBindingSource.Current as MATERIAL;
            var _producto = pRODUCTOBindingSource.Current as PRODUCTO;

            if (_producto != null)
            {
                if (txtMatDetalle.Text != null && txtMatDetalle.Text != "" && txtMatDetalle.Text != string.Empty)
                {
                    foreach (var item in _producto.DETALLE_PRODUCTO)
                    {
                        var descMayus = (txtMatDetalle.Text).ToUpper();
                        var itemMat = (item.MATERIAL.Descripcion).ToUpper();
                        var a = itemMat.Contains(descMayus);
                        if (a == true)
                        {
                            listatemp.Add(item);
                        }
                    }
                    dETALLE_PRODUCTOBindingSource.DataSource = listatemp;
                    dETALLE_PRODUCTOBindingSource.ResetBindings(true);
                }
                else
                {
                    dETALLE_PRODUCTOBindingSource.DataSource = _producto.DETALLECOMPRAs;
                    dETALLE_PRODUCTOBindingSource.ResetBindings(true);
                }
            }
            else
                MessageBox.Show("No existen materiales en el detalle", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void CalcularTotal()
        {
            var _producto = pRODUCTOBindingSource.Current as PRODUCTO;

            if (_producto != null)
            {
                var tot = _producto.DETALLE_PRODUCTO.Sum(p => p.Monto);
                _producto.Costo = Math.Round(tot, 2);
                pRODUCTOBindingSource.ResetBindings(true);
            }
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            var unds = uNIDAD_MEDIDABindingSource.Current as UNIDAD_MEDIDA;

            var _producto = pRODUCTOBindingSource.Current as PRODUCTO;

            var msg = "ERROR";
            if (_producto != null)
            {
                _producto.Codigo = ""; //codigoTextBox.Text.ToUpper();
                _producto.Descripcion = descripcionTextBox.Text.ToUpper();
                _producto.Costo = 0;

                if (isNew == true)
                {
                    try
                    {
                        var cant = 0;
                        foreach (var item in _producto.DETALLE_PRODUCTO)
                        {
                            if (item.Cantidad > 0 && item.PrecioUnit > 0)
                            {
                                cant++;
                            }
                            else MessageBox.Show("El precio del Material " + item.MATERIAL.Descripcion + " debe ser mayor a  0", "Mensaje",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }

                        if (cant == _producto.DETALLE_PRODUCTO.Count)
                        {
                            productoBL.AddProducto(_producto);
                            MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                if (isNew == false)
                {
                    try
                    {
                        var cant = 0;
                        foreach (var item in _producto.DETALLE_PRODUCTO)
                        {
                            if (item.Cantidad > 0 && item.PrecioUnit > 0)
                            {
                                cant++;
                            }
                            else MessageBox.Show("El precio del Material " + item.MATERIAL.Descripcion + " debe ser mayor a  0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        }

                        if (cant == _producto.DETALLE_PRODUCTO.Count)
                        {
                            _producto.UNIDAD_MEDIDAs = unds;
                            productoBL.UpdateProdConMaterial(_producto);
                            Editar(_producto.Id);
                            MessageBox.Show("Modificación Correcta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
            }
        }
        
        private void dETALLE_PRODUCTODataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 || e.ColumnIndex == 2)
            {
                DETALLE_PRODUCTO _detalle = dETALLE_PRODUCTOBindingSource.Current as DETALLE_PRODUCTO;

                if (_detalle != null)
                {
                    if (_detalle.Cantidad >= 1)
                    {
                        CalcularTotal();
                    }
                    else
                    {
                        MessageBox.Show("La cantidad no puede ser menor a 0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        _detalle.Cantidad = 1;
                    }

                    var material = materialBL.GetFromMaterialById(_detalle.materialId);

                    if ((_detalle.PrecioUnit > material.Costo || _detalle.PrecioUnit < material.Costo) && _detalle.PrecioUnit != 0)
                    {
                        MessageBox.Show("El Precio del material es diferente al costo actual", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        frmMttoMaterial frm = new frmMttoMaterial();
                        frm.EditarOfCompra(_detalle.PrecioUnit, material.Id);
                        frm.ShowDialog();
                    }


                    var currentMaterial = materialBL.GetFromMaterialById(_detalle.materialId);
                    _detalle.PrecioUnit = currentMaterial.Costo;
                    CalcularTotal();
                    dETALLE_PRODUCTOBindingSource.ResetBindings(true);
                }
            }
        }

        private void dETALLE_PRODUCTODataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dETALLE_PRODUCTODataGridView.Columns[e.ColumnIndex].Name.Equals("Quitar"))
            {
                var _producto = pRODUCTOBindingSource.Current as PRODUCTO;
                var _detalle = dETALLE_PRODUCTOBindingSource.Current as DETALLE_PRODUCTO;

                var rpt = MessageBox.Show(this, string.Format("¿Desea quitar el material del detalle?"), "Mensaje",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (rpt == DialogResult.Yes)
                {
                    if (_detalle.Id > 0)
                    {
                        var materialAlm = materialBL.GetFromMaterialById(_detalle.materialId);

                        if (_detalle.Cantidad < materialAlm.Stock)
                        {
                            detProdBL.RemoveDetalleProductoByMaterialIdAndProductoId(_detalle.materialId, _producto.Id);
                            dETALLE_PRODUCTOBindingSource.RemoveCurrent();
                        }
                        else
                        {
                            //MessageBox.Show("La cantidad del detalle excede el stock actual del producto","Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            MessageBox.Show("Ya se redujo el stock del material actual", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else dETALLE_PRODUCTOBindingSource.RemoveCurrent();

                    CalcularTotal();
                }
            }
        }

        private void dETALLE_PRODUCTODataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("Asegúrese de ingresar valores correctos", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void txtMatDetalle_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var slash = Convert.ToString("/");
            var punto = Convert.ToString(".");
            string cadena = guion + slash + punto + (char)8;

            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }

        private void descripcionTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var slash = Convert.ToString("/");
            var punto = Convert.ToString(".");
            string cadena = guion + slash + punto + (char)8;

            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }

        private void codigoTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var slash = Convert.ToString("/");
            var punto = Convert.ToString(".");
            string cadena = guion + slash + punto + (char)8;

            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }

        private void stockTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var slash = Convert.ToString("/");
            var punto = Convert.ToString(".");
            string cadena = guion + slash + punto + (char)8;

            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }

        private void TxtDescripcion_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var slash = Convert.ToString("/");
            var punto = Convert.ToString(".");
            string cadena = guion + slash + punto + (char)8;

            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }

        private void precioTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsNumber(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != (char)Keys.Back && e.KeyChar != (char)Keys.Enter)
            {
                e.Handled = true;
            }

            if (e.KeyChar == '.' || e.KeyChar == '\b')
            {
                e.Handled = false;
            }
        }

        

       

   

        

    


        


    }
}
